/**
 * 包含常用的工具方法和easyUI扩展方法
 * @author hubery.niejinzhen
 * @time 20130709
 */


/******************************************************************************************************************************************************************/
/***********************************************************************opmex extend  start***********************************************************************/
/******************************************************************************************************************************************************************/
/**
 * opmextech 方法、属性扩展
 * @author jay.zhoujingjie
 */
var opmex = {};
opmex.title = {
    alert  : "温馨提示",
    confirm: "温馨提示",
    prompt : "温馨提示"
}
// 手机号码正则表达式
opmex.regex=/((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)/;
/**
 * alert
 * @author jay.zhoujingjie
 */
opmex.alert = function (message, fn)
{
    $.messager.alert(opmex.title.alert, message, "", function ()
    {
        if (fn)
        {
            fn.call(this);
        }
    });
}
/**
 * confirm
 * dependency jquery.easyui.message
 * @param message  $.messager.confirm
 * @param callback
 * @author jay.zhoujingjie
 */
opmex.confirm = function (message, callback)
{
    $.messager.confirm(opmex.title.confirm, message, function (r)
    {
        callback.call(this, r);
    })
}
/**
 * dependency jquery.easyui.message
 * @param message
 * @param callback
 * @author jay.zhoujingjie
 */
opmex.prompt = function (message, callback)
{
    $.messager.prompt(opmex.title.prompt, message, function (r)
    {
        callback.call(this, r);
    })
}
/******************************************************************************************************************************************************************/
/***********************************************************************opmex extend  end***********************************************************************/
/******************************************************************************************************************************************************************/

/**
 * 验证是否为数字
 */



/**
 * easyUI扩展方法-校验无效空字符串
 * @author hubery.niejinzhen
 */
if ($.fn && $.fn.validatebox && $.fn.validatebox.defaults)
{
    $.extend($.fn.validatebox.defaults.rules,
        {
            equals: {
                validator: function (value, param)
                {
                    return value == $(param[0]).val();
                },
                message  : 'Field do not match.'
            },
            //验证是否是数字
            isNumber: {   
            	validator: function(value, param){ 
            		// 排除正无穷大
            		if(value == Number.POSITIVE_INFINITY){
            			return false;
            		}
            		
            		if(isNaN(value)){
            			return false;
            		}else{
            			return true;
            		}
            	},
//              message: 'Please enter at least {0} characters.'  
            	message: '必须输入数字'
            },
            
            //验证开始时间小于结束时间
            checkStartOverDate: {   
            	validator: function(value, param){// param传过来的参数 
            		var startTime = $(param[0]).datetimebox('getValue');
            		if(startTime==""||value==""){
            			return true;
            		}
//            		var start =  $.fn.datebox.defaults.parser(startTime);
//            		var over= $.fn.datebox.defaults.parser(value);
            		var start =  common.dateParser(startTime);
            		var over = common.dateParser(value);			
            		return over>=start;
            	}, 
            	message: '结束时间要大于等于开始时间'
            },
            
            // 验证手机号码格式
            checkMobile:{
            	validator: function(value, param){// param传过来的参数 
            		return opmex.regex.test(value);
            	},
            	message: '手机号码格式不对'
            }
	}); 
    
    $.extend($.fn.validatebox.methods, {    
    	//移除验证
        remove: function(jq, newposition){    
            return jq.each(function(){    
                $(this).removeClass("validatebox-text validatebox-invalid").unbind('focus.validatebox').unbind('blur.validatebox');  
            });    
        },  
        
        //还原验证
        reduce: function(jq, newposition){    
            return jq.each(function(){    
               var opt = $(this).data().validatebox.options;  
               $(this).addClass("validatebox-text").validatebox(opt);  
            });    
        }     
    }); 
}


/******************************************************************************************************************************************************************/
/***********************************************************************JQUERY extend  start***********************************************************************/
/******************************************************************************************************************************************************************/
/**
 * jQuery扩展
 *
 * @author jay.zhoujingjie
 */
jQuery.extend(
    {
        // 对$.ajax方法做封装,好处：全局ajax控制
        //使用方式：$.request({....})
        request: function (args)
        {
            var options =
            {
                url        : '',
                data       : {},
                dataType   : "text",
                async      : true,
                type       : "get",
                contentType: "application/x-www-form-urlencoded",
                beforeSend : function (XMLHttpRequest)
                {
                },
                complete   : function (XMLHttpRequest, textStatus)
                {
                },
                error      : function (XMLHttpRequest, textStatus, errorThrown)
                {
                },
                success    : function (data, textStatus, jqXHR)
                {
                }
            };
            jQuery.extend(true, options, args);
            $.ajax(
                {
                    url        : options.url,
                    data       : options.data,
                    dataType   : options.dataType,
                    async      : options.async,
                    type       : options.type,
                    contentType: options.contentType,
                    beforeSend : function (XHR)
                    {
                        options.beforeSend.call(this, XHR);
                    },
                    complete   : function (XHR, TS)
                    {
                        options.complete.call(this, XHR, TS);
                    },
                    error      : function (XHR, TS, ET)
                    {
                        $.messager.alert("警告:", XHR.responseText,"warning");
                        options.error.call(this, XHR, TS, ET);
                    },
                    success    : function (result, TS, XHR)
                    {
                        options.success.call(this, result, TS, XHR);
                    }
                });
        }
    });
/******************************************************************************************************************************************************************/
/***********************************************************************JQUERY extend  end  ***********************************************************************/
/******************************************************************************************************************************************************************/



/******************************************************************************************************************************************************************/
/***********************************************************************JQUERY AjaxError  start  ******************************************************************/
/******************************************************************************************************************************************************************/
jQuery.ajaxSetup({
	error:function(jqXHR, textStatus, errorThrown){
		$.messager.alert("警告:", jqXHR.responseText,"warning");
	}, 
});




/******************************************************************************************************************************************************************/
/***********************************************************************JQUERY AjaxError  end**********************************************************************/
/******************************************************************************************************************************************************************/




/******************************************************************************************************************************************************************/
/***********************************************************************  普通 extend  start***********************************************************************/
/******************************************************************************************************************************************************************/



///数组扩展是因为部分常用数组方法在某些浏览器上不支持,所以扩展。
/**
 * 数组去重
 * @author jay.zhoujingjie
 * @example: [1,2,3,2,1].unique()   ->[1,2,3]
 */
if (!Array.prototype.unique)
{
    Array.prototype.unique = function ()
    {
        var temp = [];
        this.forEach(function (d)
        {
            if ($.inArray(d, temp) == -1)
            {
                temp.push(d);
            }
        });
        return temp;
    }
}
/**
 * 数组forEach 方法,为了让IE8支持该方法
 * @author jay.zhoujingjie
 * @example:
 * [1,2,3].forEach(function(d){
 *      // 1,2,3
 *  })
 */
if (!Array.prototype.forEach)
{
    Array.prototype.forEach = function (fn)
    {
        for (var i = 0; i < this.length; i++)
        {
            fn.call(this, this[i]);
        }
    }
}
/**
 * 数组map方法，为了让ie8支持
 * @author jay.zhoujingjie
 */
if (!Array.prototype.map)
{
    Array.prototype.map = function (fn)
    {
        var temp = [];
        for (var i = 0; i < this.length; i++)
        {
            temp.push(fn.call(arguments[i], this[i], i, this));
        }
        return temp;
    }
}
/**
 *  数组every方法，为了让ie8支持
 * @author jay.zhoujingjie
 */
if (!Array.prototype.every)
{
    Array.prototype.every = function (fn /*, thisArg */)
    {
        for (var i = 0; i < this.length; i++)
        {
            if (i in temp && !fn.call(this, this[i], i, this))
            {
                return false;
            }
        }
        return true;
    }
}
/**
 * some  :  fn中返回一个true/false,数组中所有元素中，只要有一个满足fn中条件则返回true
 * @author jay.zhoujingjie
 */
if (!Array.prototype.some)
{
    Array.prototype.some = function (fn /*args*/)
    {
        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
        for (var i = 0; i < this.length; i++)
        {
            if (fn.call(thisArg, this[i], i, this))
            {
                return true;
            }
        }
        return false;
    }
}
/**
 * 判断是否是数组
 * @author jay.zhoujingjie
 * @example: Array.isArray(value)  -> true/false
 */
if (!Array.isArray)
{
    Array.isArray = function (vArg)
    {
        return Object.prototype.toString.call(vArg) === "[object Array]";
    };
}
/**
 * 变成数组
 * @author jay.zhoujingjie
 * @example: Array.or(1,2) -> [1,2]
 */
if (!Array.of)
{
    Array.of = function ()
    {
        return Array.prototype.slice.call(arguments);
    };
}
/**
 * 数组过滤
 * @author jay.zhoujingjie
 * @example: [1,2,3,4].filter(function(d){
 *      return d>2;
 * });  -> [3,4]
 *
 */
if (!Array.prototype.filter)
{
    Array.prototype.filter = function (fn /*thisArgs*/)
    {
        var temp = [];
        for (var i = 0; i < this.length; i++)
        {
            if (fn.call(this, this[i], i, this))
            {
                temp.push(this[i]);
            }
        }
        return temp;
    }
}
/**
 * indexOf
 * @author jay.zhoujingjie
 */
if (!Array.prototype.indexOf)
{
    Array.prototype.indexOf = function (searchElement, fromIndex)
    {
        for (var i = fromIndex || 0; i < this.length; i++)
        {
            if (this[i] == searchElement)
            {
                return i;
            }
        }
        return -1;
    }
}

/**
 * 根据index删除数组元素
 * @param index
 * @returns {Boolean}
 */
Array.prototype.del=function(index){  
    if(isNaN(index)||index>=this.length){ 
        return false; 
    }  
    for(var i=0,n=0;i<this.length;i++){ 
        if(this[i]!=this[index]){ 
            this[n++]=this[i]; 
        } 
    }  
    this.length-=1; 
};

/**
 * 为字符串添加去前后空格方法
 * @author jay.zhoujingjie
 */
if (!String.prototype.trim)
{
    String.prototype.trim = function ()
    {
        return this.replace(/^\s|\s$/, "");
    }
}
/******************************************************************************************************************************************************************/
/***********************************************************************  普通 extend  end  ***********************************************************************/
/******************************************************************************************************************************************************************/


/**
 * BASE 64 加密/解密
 */
(function(){
    if(!window.Base64){
        window.Base64 = {};
    }
    Base64.encode = function(data) {
        var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
            ac = 0,
            enc = "",
            tmp_arr = [];

        if (!data) {
            return data;
        }

        do {
            o1 = data.charCodeAt(i++);
            o2 = data.charCodeAt(i++);
            o3 = data.charCodeAt(i++);

            bits = o1 << 16 | o2 << 8 | o3;

            h1 = bits >> 18 & 0x3f;
            h2 = bits >> 12 & 0x3f;
            h3 = bits >> 6 & 0x3f;
            h4 = bits & 0x3f;

            // use hexets to index into b64, and append result to encoded string
            tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
        } while (i < data.length);

        enc = tmp_arr.join('');

        var r = data.length % 3;

        return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
    }
    Base64.decode =function(data) {
        var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
            ac = 0,
            dec = "",
            tmp_arr = [];

        if (!data) {
            return data;
        }

        data += '';

        do {
            h1 = b64.indexOf(data.charAt(i++));
            h2 = b64.indexOf(data.charAt(i++));
            h3 = b64.indexOf(data.charAt(i++));
            h4 = b64.indexOf(data.charAt(i++));

            bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

            o1 = bits >> 16 & 0xff;
            o2 = bits >> 8 & 0xff;
            o3 = bits & 0xff;

            if (h3 == 64) {
                tmp_arr[ac++] = String.fromCharCode(o1);
            } else if (h4 == 64) {
                tmp_arr[ac++] = String.fromCharCode(o1, o2);
            } else {
                tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
            }
        } while (i < data.length);

        dec = tmp_arr.join('');

        return dec;
    }
})();
